#include <iostream>

using namespace std;

//函数声明
bool search(int n);                                 
int call_shell(string pwd, string path);           
int get_char_len(string characters);                

//全局变量
string path;                                     
string characters;                              
char* pwd;                                 
int digits,sh,len;                                        

//主函数
int main(){
    
    cout << "***********************************GetBackDmg***********************************" << endl;
    cout << "说明：" << endl;
    cout << "   GetBackDmg能够根据您记忆中的密码字符和密码的范围帮助您缩小穷举范围，" << endl;
    cout << "用简单暴力的方式找回您遗失的DMG密码。您描述的信息比较准确时，能大大减少" << endl;
    cout << "查找难度。请勿用GetBackDmg破解他人的DMG文件，盲目的输入错误或者不精" << endl;
    cout << "确的信息会导致破解难度急剧上升。更多使用信息请浏览README.MD文件。" << endl;
    cout << "********************************制作者：lyke3028********************************" << endl;
    cout << "请输入dmg所在路径：";
    cin >> path;
    cout << "请输入可能的密码最小位数：";
    cin  >> sh;
    cout << "请输入可能的密码最大位数：";
    cin  >> len;
    cout << "输入可能使用的字符：";
    cin >> characters;
    for (digits = sh; digits <= len; digits++)
    {
        pwd = new char[digits + 1];
        int n = 0;
        search(n);
        delete[] pwd;
    }
    cout << "**********测试结束，若找到密码请赶快移走文件，若查找失败请重试！*********";
    return 0;
}

bool search(int n){
    if(n > digits) return false;
    for(int i = 0; i < get_char_len(characters); i++){
        pwd[n] = characters[i];
        if(n == digits){
            pwd[n] = '\0';
            if(256 == call_shell(pwd, path))
                return true;
            return false;
        }
        if(search(n+1)) return true;
    }
    return false;
}
int call_shell(string pwd, string path){
    string str = "./shell.sh " + path + " "+ pwd;
    char command[255];
    strcpy(command, str.c_str());
    return system(command);
}
int get_char_len(string characters){
    for (int i = 0; i < 255; i++){
        if(characters[i] == '\0') 
            return i;
    } 
    return -1;       
}
